0%

【Vim】Vim常用配置<一>

疫情在家期间,也在新电脑上准备用vim写科研论文。但是之前配置好的.vimrc文件中的配置在实验室的电脑上,我自己又懒得再配置一遍,于是作罢,选择了sublime来进行科研写作,顺便写了一篇《使用Sublime Text3撰写科研论文》。现在已经在实验室了,于是乎我将我的vim配置文件介绍介绍,放在网上,以防万一。同时,也给有需要的人借鉴参考。虽然去年在文章《使用Vim撰写科研论文》介绍了如何利用vim编写论文,只是介绍了与LaTex相关的插件。这里,我们将介绍一般性的编辑工作所需要的配置。


状态栏设置

安装插件代码如下:

1
2
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'

然后,我们可以在主题中选择颜色样式,主题列表见链接。可使用如下命令指定主题:

1
let g:airline_theme="solarized"

呈现效果如图1:

图1

关于状态栏每个区域的含义可以见vim-airline的描述文件,这里不再赘述。


文件搜索

安装插件代码如下:

1
Bundle 'kien/ctrlp.vim'

常用设置代码如下:

1
2
3
4
5
6
7
8
9
"-------Shortcuts for the plugin ctrlp
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'
let g:ctrlp_by_filename=1
"set the types of files that can be ignored
let g:ctrlp_custom_ignore = {
\ 'dir': '\v[\/]\.(git|hg|svn|rvm)$',
\ 'file': '\v\.(exe|so|dll|zip|tar|tar.gz|pyc)$',
\ }

这样我们可以通过Ctrl+p打开文件搜索,这时,我们可以通过Ctrl+f或者Ctrl+b在不同模式(mru, files, buffers)中选择,然后输入要搜索的文件名,如下图2:

图2

在搜索结果中,我们可以使用Ctrl+j,k来上下选择我们想要的文件,最后enter就可以打开该文件了。更多操作可见该项目的说明文档


界面颜色设置

安装插件代码如下:

1
Plugin 'altercation/vim-colors-solarized'

设置代码如下:

1
2
3
set t_Co=256
set background=dark
colorscheme solarized

这里我们设置为深色模式,比较契合MacOS的深色模式,如上图2所示。注意本文中的所有设置是针对MacVIM的,对于在终端使用vim(而不是gvim)打开的vim编辑器,会出现雾面现象,主要是颜色的支持问题,如下图所示:
图3

还有,我们可以使用如下命令来设置界面的透明化程度:

1
set transparency=2

树形目录插件

安装插件代码如下:

1
Plugin 'scrooloose/nerdtree'

设置代码如下:

1
2
3
4
5
6
7
8
"-------Settings for NERDTree--------
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
autocmd vimenter * NERDTree
"Close vim when the NERDTree is the only window
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
let NERDTreeIgnore=['\.pyc','\~$','\.swp']
let g:NERDTreeShowLineNumbers=1

经过上述设置,每次打开一个新文件时,左侧都会有目录,效果如下图(目录中的图标和颜色设置会在下一小节中介绍):

图4

但是,左侧的目录并不会随着打开的文件所在目录而更新。为此,我们可以添加如下命令:

1
2
"To update the NERDTree when change the Tab by gt
nnoremap gt gt:NERDTreeFind<CR><C-w>l

这样我们可以通过gt来切换tab,同时更新左侧的目录。关于NERDTree的更多操作,可以直接在目录窗口,输入?来查看说明。


文件类型高亮

对于我们日常工作科研来说,常遇到的就是这几类文件:.tex.pdf.c.py等等文件。为了在NERDTree目录中高亮显示,我们需要安装如下插件:

1
2
Plugin 'ryanoasis/vim-devicons'
Plugin 'tiagofumo/vim-nerdtree-syntax-highlight'

其中,vim-devicons是给不同文件类型显示不同图标;vim-nerdtree-syntax-highlight是让不同类型文件显示不同颜色。

其常用设置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
" NERDTress File highlighting
"Set the vim-devicons


"Can be enabled or disabled
"vim-nerdtree-syntax-highlight settings
""""""""""""""""""""""""""""""
let g:WebDevIconsDisableDefaultFolderSymbolColorFromNERDTreeDir = 1
let g:WebDevIconsDisableDefaultFileSymbolColorFromNERDTreeFile = 1
" not to show brackets around flags
let g:webdevicons_conceal_nerdtree_brackets = 1
" enable folder/directory glyph flag (disabled by default with 0)
let g:WebDevIconsUnicodeDecorateFolderNodes = 1
" enable open and close folder/directory glyph flags (disabled by default with 0)
let g:DevIconsEnableFoldersOpenClose = 1

" use double-width(1) or single-width(0) glyphs
" only manipulates padding, has no effect on terminal or set(guifont) font
let g:WebDevIconsUnicodeGlyphDoubleWidth = 0
" Force extra padding in NERDTree so that the filetype icons line up vertically
let g:WebDevIconsNerdTreeGitPluginForceVAlign = 1

"Highlight full name (not only icons). You need to add this if you don't have vim-devicons and want highlight.
let g:NERDTreeFileExtensionHighlightFullName = 1
let g:NERDTreeExactMatchHighlightFullName = 1
let g:NERDTreePatternMatchHighlightFullName = 1

"Highlight full name (not only icons). You need to add this if you don't have vim-devicons and want highlight.
let g:NERDTreeHighlightFolders = 1

"highlights the folder name
let g:NERDTreeHighlightFoldersFullName = 1

"you can add these colors to your .vimrc to help customizing
let s:brown = "905532"
let s:aqua = "3AFFDB"
let s:blue = "689FB6"
let s:darkBlue = "44788E"
let s:purple = "834F79"
let s:lightPurple = "834F79"
let s:red = "AE403F"
let s:beige = "F5C06F"
let s:yellow = "F09F17"
let s:orange = "D4843E"
let s:darkOrange = "F16529"
let s:pink = "CB6F6F"
let s:salmon = "EE6E73"
let s:green = "8FAA54"
let s:Turquoise = "40E0D0"
let s:lightGreen = "31B53E"
let s:white = "FFFFFF"
let s:rspec_red = "FE405F"
let s:git_orange = "F54D27"
let s:gray = "808A87"

let g:NERDTreeExtensionHighlightColor = {} " this line is needed to avoid error
let g:NERDTreeExtensionHighlightColor['py'] = s:orange " sets the color of py files to blue
let g:NERDTreeExtensionHighlightColor['tex'] = s:yellow " sets the color of tex files to blue
let g:NERDTreeExtensionHighlightColor['c'] = s:green " sets the color of c files to blue
let g:NERDTreeExtensionHighlightColor['pdf'] = s:beige " sets the color of pdf files to blue
let g:NERDTreeExtensionHighlightColor['c++'] = s:green " sets the color of c++ files to blue

上述设置都是参考官方主页https://github.com/tiagofumo/vim-nerdtree-syntax-highlighthttps://github.com/ryanoasis/vim-devicons 。其效果如下:

图5

安装上述两个包时,需要安装nerd-fonts这个字体库。在MacOS中可以使用方法4(Homebrew Fonts)安装,即在终端输入:

1
2
3
4
5
brew tap homebrew/cask-fonts

brew cask install font-hack-nerd-font
brew cask install font-droid-sans-mono-nerd-font
brew cask install font-droid-sans-mono-for-powerline

使用上述第一条命令时,要经过漫长的等待过程,并且经常会出现如下错误:

1
2
3
4
error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

这时可以采用如下链接:https://www.jianshu.com/p/24c7430fa124 解决。接下来的三条命令是具体字体的安装,所有的字体可见链接:https://github.com/Homebrew/homebrew-cask-fonts/tree/master/Casks 。完成上述命令后,我们需要在MacVim中的.vimrc文件中添加配置命令来防止目录的图标乱码不显示:

1
2
set encoding=UTF-8
set guifont=DroidSansMono_Nerd_Font:h16

效果如上图5所示。我们发现,图5中的图标会出现显示不完全的情况,这是一个Open issue (未完全解决):https://github.com/ryanoasis/vim-devicons/issues/133,一个可能的方式是在`.vimrc`文件中添加如下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
augroup custom_nerdtree_options
autocmd!
autocmd FileType,WinEnter * :call <SID>SetNerdTreeOptions()
augroup END

function! s:SetNerdTreeOptions() abort
if &l:filetype ==# 'nerdtree'
let g:default_opts = {
\ 'ambiwidth': &ambiwidth,
\ 'listchars': &listchars,
\ 'list' : &l:list,
\ }
setlocal ambiwidth=double listchars=space:. nolist
else
if exists('g:default_opts')
let [&ambiwidth, &listchars, &l:list] = [
\ g:default_opts.ambiwidth,
\ g:default_opts.listchars,
\ g:default_opts.list
\ ]
unlet g:default_opts
endif
endif
endfunction

这样,图标就能完全显示了:

图6

这样做其实还有一个bug:当在一个macvim窗口用多个tab打开多个文件时,图标又会显示不完全,但是此时当焦点在目录时,图标会完全显示。


成对插入符号

安装插件如下:

1
Plugin 'tpope/vim-surround'

常用设置代码如下:

1
2
3
4
"-------Shortcuts for the plugin tpope/vim-surround
nmap <leader>) ysiw)
nmap <leader>} ysiw}
nmap <leader>" ysiw"

关于快捷键的详细设置,我们可以参考其主页,或则直接使用命令 :help surround在Vim中查看。我们发现很多命令都需要按多个键,比如上面的用括号包围一个单词,命令为ysiw)。在我的日常使用场景(写文章),最常用的就是中括号和大括号。为方便起见,我就用上述的快捷键映射就可以只需要输入,)即可,这里的逗号是我定义的<leader>


构建C/C++项目

安装插件如下:

1
Plugin 'skywind3000/asyncrun.vim' "for running C

快捷键设置如下:

1
2
3
4
5
6
7
8
9
10
11
"-------settings for the plugin asyncrun
"open quickfix windown, the height is 6
let g:asyncrun_open =6
"The bell rings when the task is finished
let g:asyncrun_bell =1
let g:asyncrun_rootmarks = ['.svn', '.git', '.root', '_darcs', 'build.xml']
"call for the quickfix window
autocmd FileType c,cpp nnoremap <leader>c :call asyncrun#quickfix_toggle(6)<cr>
"Shortcuts for compiling and run the c file
autocmd FileType c,cpp nnoremap <silent> <leader>b :AsyncRun -cwd=<root> make <cr>
autocmd FileType c,cpp nnoremap <silent> <leader>r :AsyncRun -cwd=<root> -raw make run <cr>

这样我们就可以使用<leader>b<leader>r来分别编译和运行C/C++项目了。关于这个插件更详细的介绍说明,可以参考主页或者该作者的博客

需要注意的是,如果只有单个文件,上面这些设置已经足够了。但是,一般来说,一个项目会包含多个源文件,这时我们就得自己编写makefile文件来关联多个源文件。下面以一个简单的例子来说明:有三个文件,分别为hello.hhello.c, test.c(主文件)。其内容分别为:

  • hello.h

    1
    2
    3
    #include<stdio.h>

    void hello();
  • hello.c

    1
    2
    3
    4
    5
    6
    #include"hello.h"

    void hello()
    {
    printf("Hello World From hello.c!\n");
    }
  • test.c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include<stdlib.h>
    #include<stdio.h>
    #include"hello.h"
    #include<time.h>

    int main()
    {
    int abstact=1;
    printf("Hello World From test.c!\n");
    hello();

    return 0;
    }

这里我们直接编译会报错如下:

图7

这就是提醒我们需要编写makefile文件,具体如何编写makefile文件,请自行网上搜索。下面给出了对于这个例子的makefile文件:

  • makefile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    objects=test.o hello.o
    cc=g++

    test:$(objects)
    cc -o test $(objects)

    test.o:test.c
    hello.o:hello.h

    run: test
    ./test
    .PHONY:clean
    clean:
    rm test $(objects)

这样我们就有四个文件:hello.hhello.c, test.cmakefile。这时,我们按下<leader>b编译项目可得:

图8

最后按键<leader>r运行该项目可得:

图9

从上面可以看出,使用Vim来开发大型项目(源文件很多)是不太方便,使用集成开发环境VS或者VS code是一个相对更好的选择。Vim更适合来编写单个文件,比如我经常来写论文的.tex文件。当然,在写论文时,我们也可以将不同部分(比如 abstract, introduction, system model等等)分成不同的.tex文件,然后在主文件中使用\input命令直接调用即可,这里就没有这里的C/C++项目复杂,不要自己编写makefile。另外需要注意的是,我也是设置<leader>b编译.tex文件。在编译C项目后,在同一vim窗口不同tab再编译.tex文件会产生错误。这里我们可以用一个新的vim窗口打开.tex文件编译即可。


目录导航

在写较长的文章或则程序时,我们可以借助这里的目录导航快速跳转到想到的地方去。安装该插件的代码如下:

1
Plugin 'majutsushi/tagbar'

其常用设置如下:

1
2
3
4
5
6
7
8
"-------Configurations for the plugin ctags
let g:tagbar_ctags_bin='/usr/local/bin/ctags'
let g:tagbar_width=30
let g:tagbar_right=1
"AutoOpen tagbar for c/c++ files
autocmd BufReadPost *.cpp,*.c,*.h,*.hpp,*.cc call tagbar#autoopen()
"Open or close tagbar
map <leader>tb :TagbarToggle<CR>

这样,我们可以通过<leader>tb打开和关闭目录侧边栏。

如下图10所示,在c文件中,右侧显示的每个函数名:

图10

如下图11所示,在.tex文件中,右侧显示的是每个part和label:

图11

左侧显示的是vimtex插件自带的目录,其快捷键我定义为<leader>t。可见,ctags所显示的目录个人觉得更加具有条理性。


注释与反注释

插件安装代码如下:

1
Plugin 'scrooloose/nerdcommenter'

配置代码如下:

1
2
" Add a space before comments
let g:NERDSpaceDelims=1

这样们可以通过<leader>cc来进行注释或者批量注释,通过<leader>cu进行反注释,相比于VS的Ctrl + k + cCtrl + k + u的注释方便多了。注释时,会在注释符和代码前加个空格,更多的个性化设置请见其主页


对齐线

插件安装代码如下:

1
Plugin 'Yggdroot/indentLine'

配置代码如下:

1
2
3
"-------Settings for the plugin indentline
let g:indentLine_char='|'
let g:indentLine_enabled=1

这个对齐线对于python编程应该比较友好,毕竟python语法对于缩进敏感,其效果图如图12:

图12

更多的样式设置请参考其主页


代码隐藏

插件安装代码如下:

1
Plugin 'KeitaNakamura/tex-conceal.vim'

配置代码如下:

1
2
set conceallevel=2
let g:tex_conceal='abdmg'

这样一些数学的LaTeX代码就显示为数学符号,即所见即所得。如下图13所示:

图13


Python环境配置

插件安装代码如下:

1
Plugin 'vim-scripts/indentpython.vim'

配置代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"-------Configurations for Python
set encoding=utf-8
au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set expandtab|set autoindent|set fileformat=unix
set clipboard=unnamed
let python_highlight_all=1

function CheckPythonSyntax()
let mp = &makeprg
let ef = &errorformat
let exeFile = expand("%:t")
setlocal makeprg=python3\ -u
set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
silent make %
copen
let &makeprg = mp
let &errorformat = ef
endfunction
au filetype python map <leader>b :w <cr> :call CheckPythonSyntax() <cr> :cw<cr>

这样我们只需要通过命令<leader>b来编译运行.py文件了,如图14:

图14

这里有个缺点就是,输出是使用quickfit window (使用:copen打开该窗口),无法交互式输入。所以我还是推荐使用pycharm来作为python的开发环境吧。


坚持原创技术分享,您的支持将鼓励我继续创作!